#include "../../include/memPool/pool.hpp"
#include <iostream>
#include <vector>

// 演示memPool内存池的基本使用方法
int main() {
    std::cout << "=== memPool 使用示例 ===" << std::endl;
    
    // 1. 创建内存池实例（使用单例模式的create_shared方法）
    std::cout << "创建内存池实例..." << std::endl;
    auto memPool = wheels::memPool<int>::create_shared();
    
    // 2. 注册内存类型
    // 参数1: size - 每个内存块包含的元素数量（这里是10个int）
    // 参数2: count - 初始内存池大小（这里是5个内存块）
    std::cout << "注册内存类型: 每个块10个int，初始池大小5..." << std::endl;
    memPool->registerType(10, 5);
    
    // 3. 分配内存
    std::cout << "分配10个内存块（将触发自动扩容）..." << std::endl;
    std::vector<std::shared_ptr<int>> allocations;
    for (int i = 0; i < 10; ++i) {
        auto ptr = memPool->malloc(10);
        if (ptr) {
            // 在分配的内存中写入数据
            ptr.get()[0] = i * 100;  // 第一个元素设置为索引*100
            allocations.push_back(ptr);
            std::cout << "  分配块 " << i << "，首元素值: " << ptr.get()[0] << std::endl;
        }
    }
    
    // 4. 测试最佳匹配功能
    // 请求一个未注册的大小（15），应该匹配到最接近的较大块（20，如果已注册）
    std::cout << "\n测试最佳匹配功能..." << std::endl;
    // 先注册20大小的内存块
    memPool->registerType(20, 3);
    // 请求15大小的内存块
    auto bestFitPtr = memPool->malloc(15);
    if (bestFitPtr) {
        bestFitPtr.get()[0] = 999;
        std::cout << "  使用最佳匹配策略分配到的内存块，首元素值: " << bestFitPtr.get()[0] << std::endl;
    }
    
    // 5. 释放部分内存
    std::cout << "\n释放5个内存块..." << std::endl;
    for (int i = 0; i < 5; ++i) {
        int index = allocations.size() - 1;
        std::cout << "  释放块，首元素值: " << allocations[index].get()[0] << std::endl;
        memPool->free(10, allocations.back());
        allocations.pop_back();
    }
    
    // 6. 再次分配应该重用已释放的内存
    std::cout << "\n再次分配5个内存块（应该重用刚才释放的内存）..." << std::endl;
    for (int i = 0; i < 5; ++i) {
        auto ptr = memPool->malloc(10);
        if (ptr) {
            ptr.get()[0] = 5000 + i * 100;  // 设置新的值以便区分
            allocations.push_back(ptr);
            std::cout << "  分配块，首元素值: " << ptr.get()[0] << std::endl;
        }
    }
    
    // 7. 正确释放所有剩余内存
    std::cout << "\n释放所有剩余内存块..." << std::endl;
    while (!allocations.empty()) {
        memPool->free(10, allocations.back());
        allocations.pop_back();
    }
    
    // 释放最佳匹配的内存块
    memPool->free(20, bestFitPtr);
    
    std::cout << "\n示例完成！" << std::endl;
    
    return 0;
}#include "../../include/memPool/pool.hpp"
#include <iostream>
#include <vector>

// 演示memPool内存池的基本使用方法
int main() {
    std::cout << "=== memPool 使用示例 ===" << std::endl;
    
    // 1. 创建内存池实例（使用单例模式的create_shared方法）
    std::cout << "创建内存池实例..." << std::endl;
    auto memPool = wheels::memPool<int>::create_shared();
    
    // 2. 注册内存类型
    // 参数1: size - 每个内存块包含的元素数量（这里是10个int）
    // 参数2: count - 初始内存池大小（这里是5个内存块）
    std::cout << "注册内存类型: 每个块10个int，初始池大小5..." << std::endl;
    memPool->registerType(10, 5);
    
    // 3. 分配内存
    std::cout << "分配10个内存块（将触发自动扩容）..." << std::endl;
    std::vector<std::shared_ptr<int>> allocations;
    for (int i = 0; i < 10; ++i) {
        auto ptr = memPool->malloc(10);
        if (ptr) {
            // 在分配的内存中写入数据
            ptr.get()[0] = i * 100;  // 第一个元素设置为索引*100
            allocations.push_back(ptr);
            std::cout << "  分配块 " << i << "，首元素值: " << ptr.get()[0] << std::endl;
        }
    }
    
    // 4. 测试最佳匹配功能
    // 请求一个未注册的大小（15），应该匹配到最接近的较大块（20，如果已注册）
    std::cout << "\n测试最佳匹配功能..." << std::endl;
    // 先注册20大小的内存块
    memPool->registerType(20, 3);
    // 请求15大小的内存块
    auto bestFitPtr = memPool->malloc(15);
    if (bestFitPtr) {
        bestFitPtr.get()[0] = 999;
        std::cout << "  使用最佳匹配策略分配到的内存块，首元素值: " << bestFitPtr.get()[0] << std::endl;
    }
    
    // 5. 释放部分内存
    std::cout << "\n释放5个内存块..." << std::endl;
    for (int i = 0; i < 5; ++i) {
        int index = allocations.size() - 1;
        std::cout << "  释放块，首元素值: " << allocations[index].get()[0] << std::endl;
        memPool->free(10, allocations.back());
        allocations.pop_back();
    }
    
    // 6. 再次分配应该重用已释放的内存
    std::cout << "\n再次分配5个内存块（应该重用刚才释放的内存）..." << std::endl;
    for (int i = 0; i < 5; ++i) {
        auto ptr = memPool->malloc(10);
        if (ptr) {
            ptr.get()[0] = 5000 + i * 100;  // 设置新的值以便区分
            allocations.push_back(ptr);
            std::cout << "  分配块，首元素值: " << ptr.get()[0] << std::endl;
        }
    }
    
    // 7. 正确释放所有剩余内存
    std::cout << "\n释放所有剩余内存块..." << std::endl;
    while (!allocations.empty()) {
        memPool->free(10, allocations.back());
        allocations.pop_back();
    }
    
    // 释放最佳匹配的内存块
    memPool->free(20, bestFitPtr);
    
    std::cout << "\n示例完成！" << std::endl;
    
    return 0;
}